.code16

.global bootstart

.global databeg,dataend,bssbeg,bssend,textbeg,textend

.text
textbeg:
.data
databeg:
.bss
bssbeg:

.text # text段从这里开始
.equ BOOTSEG, 0x07c0

.equ INITSEG, 0x9000
# 这是我们后面要把这个主引导程序整体搬去的地方，CS:IP=0x90000
.equ SETUPSEG,0x9020
# setup.s程序会被载入到CS:IP=0x90200处，
# 也就是主引导搬迁之后0x901ff的后面一个字节开始处
.equ SYSSEG, 0x1000
# 操作系统主要程序被加载到0x10000处，当然
# 这个时候我们是没有写操作系统主程序的，这个只是提前写一下
# 毕竟我们要在写之前先规划好空间
.equ SYSEND, 0x8000
# 这是我们操作系统程序装载的结尾地址

ljmp $BOOTSEG,$bootstart
# ljmp指令会同时对CS:IP赋值并且直接跳转到CS:IP指定的位置，
# 这里我们就直接跳转到了0x07c0:bootstart即0x07c00+bootstart位置，
# bootstart就是下面这个汇编代码的起始symbol，
# 执行该指令之后，bootloader正式进入bootstart开始执行指令

bootstart:
	mov $BOOTSEG,%ax
	mov %ax,%ds
	mov $INITSEG,%ax
	mov %ax,%es
	xor %di,%di
	xor %si,%si
	mov $0x100,%cx
	rep
	movsw
	ljmp $INITSEG,$stackset

stackset:
	mov %cs,%ax     # ax=INITSEG
	mov %ax,%ds     # ds=ax
	mov %ax,%es     # es=ax
	mov %ax,%ss     # ss=ax
	mov $0xff00,%sp # sp=0xff00

start:
	mov $0x03,%ah   # read cursor position
	xor %bh,%bh     # set page 0
	int $0x10       # BIOS video service
	mov $INITSEG,%ax
	mov %ax,%es     # es:bp points to the string
	mov $sysmsg,%bp # set string address
	mov $0x1301,%ax # write string,move cursor
	mov $0x0007,%bx # page 0,black background/white characters
	mov $28,%cx     # length of string
	int $0x10       # BIOS video service

die:
	hlt
	jmp die # infinite loop

sysmsg:
	.ascii "Starting Balloon System..."
	.byte 13,10

.=510
signature:
	.word 0xaa55

.text
textend:
.data
dataend:
.bss
bssend:
